﻿package com.eve.eplus.common.db;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import com.eve.eplus.common.tools.LogTools;

import android.content.ContentValues;

/**
 * 基础模型工具
 * 
 * @author Norsie
 * @create 12-11-28
 * 
 */
public class BaseModelTool {

    /**
     * 检查模型数据是否有效(在编辑状态下)
     * 
     */
    public static boolean isValidForEditable(BaseModel model) {
        String id = model.getId();
        String name = getTableName(model.getClass());
        return (name != null && id != null && !id.equals(""));
    }

    /**
     * 检查模型数据是否有效(查询列表情况下)
     * 
     */
    public static boolean isValidForSearchable(BaseModel model) {

        String name = getTableName(model.getClass());
        return (name != null && !name.equals(""));
    }

    /**
     * 获取字段名称的连接字符串
     * 
     * @return
     */
    public static String[] getNamesForField(Class<?> modelType) {

        int index = 0;
        List<Field> list = getFieldList(modelType);
        if (list == null || list.size() == 0) {
            return null;
        }

        String[] result = new String[list.size()];
        for (Field item : list) {
            result[index++] = item.getName().toLowerCase();
        }
        return result;
    }

    /**
     * 通过模型获取ContentValues
     * 
     * @return ContentValues支持数据库插入
     */
    public static ContentValues getContentValues(BaseModel model) {
        Object obj = null;
        ContentValues values = new ContentValues();
        List<Field> fieldInfos = getFieldList(model.getClass());

        for (Field item : fieldInfos) {

            try {
                obj = item.get(model);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                LogTools.error("数据库表模型错误信息：获取模型数据出错。", e);
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                LogTools.error("数据库表模型错误信息：获取模型数据出错。", e);
            }

            if (obj == null) {
                LogTools.info("数据库表模型错误信息："+item.getName() + " is NULL.");
                continue;
            }

            /** 
             * 针对不同的数据类型进行处理
             */
            if (isString(item)) {
                values.put(item.getName(), obj.toString());
            } else if (isLong(item)) {
                values.put(item.getName(), Long.valueOf(obj.toString()));
            }else if(isInteger(item))
            {
                values.put(item.getName(), Integer.valueOf(obj.toString()));
            }
            
            
            else {
                LogTools.error("数据库表模型错误信息：未知的数据类型.", null);
            }
        }
        return values;
    }

    /**
     * 获取所有的字段信息
     * 
     * @return
     */
    public static List<Field> getFieldList(Class<?> modelType) {
        List<Field> fieldInfos = new ArrayList<Field>();  

        for (Class cls = modelType; !cls.equals(Object.class); cls = cls
                .getSuperclass()) { 
            
            for (Field item : cls.getDeclaredFields()) {
                item.setAccessible(true);
                fieldInfos.add(item);
            }
        } 
        return fieldInfos;
    }

    /**
     * 获取注解的表名称
     * 
     * @param modelType
     * @return
     */
    public static String getTableName(Class<?> modelType) {
        TableDes table = modelType.getAnnotation(TableDes.class);
        if (table != null) {
            return table.name();
        }
        return "";
    }
    
    /**
     * 判断是否是字符串类型
     * @param item
     * @return
     */
    public static boolean isString(Field item) {

        if (item.getType().getName().toString()
                .equals("java.lang.String")) {
            return true;
        }
        return false;
    }

    public static boolean isLong(Field item) {
        if (item.getType().getName().toString()
                .equals("java.lang.Long")) {
            return true;
        }
        return false;
    }
    public static boolean isInteger(Field item) {
        if (item.getType().getName().toString()
                .equals("java.lang.Integer")) {
            return true;
        }
        return false;
    }

    public static Field getField(Class<? extends Object> modelType,
            String fieldName) {

        Field field = null;
        for (Class<?> cls = modelType; !cls.equals(Object.class)
                && field == null; cls = cls.getSuperclass()) {
            try {

                field = cls.getDeclaredField(fieldName);
                field.setAccessible(true);
            } catch (Exception e) {

            }
        }
        return field;
    }
}
